#ifndef QUERYWIDGET_H
#define QUERYWIDGET_H

#include "ui_query.h"
#include "umsdatabase.h"

class QStandardItem;
class QStandardItemModel;
	

class QueryWidget: public QWidget,Ui::QueryWidget
{
		Q_OBJECT
		UMSDatabase *_dbase;
		QStringList _columns;
		QStandardItemModel *_structModel;		
		QMap<QString,QString> _mapNames;
	
		void showData(); //< показывает данные векторов.
		QTreeWidgetItem *itemAndColumnForCoord(const QString &cname,QTreeWidgetItem *item,int &column); //< куда вставлять значение.
		int freeItemColumn(const QString &name,QTreeWidgetItem *&item); //< ищет пустую колонку в item
		QStandardItem *_itemStruct;
		
		void createStructModel();
		QMap<QString,QString> mapNames(QStandardItem *pitem);
		void loadCubes(QStandardItem *pItem,QDomElement *root);
		void loadCoordinates(QStandardItem *pItem,QDomElement *root);
		
		QString generateCrdInserts(QStandardItem *pItem,int level=0);
		QString currentCubeName();
		QStandardItem *currentItem();
		void parseData(); ///< разбирает данные полученые в результате выполнения запроса.
	public:
		QueryWidget();

		void setDatabase(UMSDatabase *dbase);		
		void setQuery(const QString &q);
		void insertText(const QString &w);
		void setText(const QString &w);
		void loadStruct(const QDomDocument &doc);
		void loadDatabaseStruct(const QString &dbname);
		static void saveComboBoxValues(QComboBox *cbox);
		static void loadComboBoxValues(QComboBox *cbox);

	public slots:
		void execQuery();
		
	private slots:
		void execXMLQuery(); ///< выполнить запрос в виде XML
		void on_treeStruct_customContextMenuRequested(QPoint pt);
		void on_pbSelectDatabase_clicked();
		void on_treeStruct_activated(const QModelIndex &index);
	
		void generateInsert();
		void generateSelect();
		void generateDelete();
		void generateCount(); //< количество векторов.
		void generateCountValues(); //< количество значений из координаты.
		void generateSetCurrentDatabase();
		void generateSelectValues(); //< выборка значений из координаты.
	protected:
		void showEvent(QShowEvent *);
		bool eventFilter(QObject *object, QEvent *e);
		
	signals:
		void queryExecuted();
};

#endif	
